﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using CruzDelSur.Models;
using CruzDelSur.Dominio;
using CruzDelSur.Dominio.Seguridad;
using CruzDelSur.Negocio;
using Microsoft.Reporting.WebForms;
using System.Globalization;

namespace CruzDelSur.Controllers
{
    public class ServiciosEspecialesController : Controller
    {
        // IoC
        // GET: /
        ServiciosEspecialesService ServiciosEspecialesService { get; set; }
        AdministrarRecursosService RecursosService { get; set; }
        ServiciosService ServiciosService { get; set; }

        public ActionResult Index()
        {
            return View("Index", ServiciosEspecialesService.obtenerListadoPromociones());
        }

        // ********************AREA DE SERVICIOS ESPECIALES*******************
        [Authorize]
        public ActionResult ServiciosEspeciales()
        {
            return View("Index");
        }

        //[Authorize]
        //public ActionResult Promociones()
        //{
        //    //return View("Index");
        //    return View("Index", ServiciosEspecialesService.obtenerListadoPromociones());
        //}

        [Authorize]
        //public ActionResult EditarPromocion()
        //{
        //    return View("EditarPromocion");
        //}

        // CONTRATOS
        [Authorize]
        public ActionResult Contratos()
        {
            return View("Contratos", ServiciosEspecialesService.obtenerListadoContratos());
        }

        [Authorize]
        public ActionResult CrearContrato()
        {
            return View("ActualizarContrato", ServiciosEspecialesService.crearNuevoContratoModel());
        }

        [Authorize, HttpPost]
        public ActionResult CrearContrato(ContratosModel datosForm)
        {
            datosForm.Contrato.Creadopor = User.Identity.Name;
            datosForm.Contrato.Modificadopor = User.Identity.Name;
            try
            {
                ServiciosEspecialesService.crearContrato(datosForm.Contrato);
                return RedirectToAction("Contratos");
            }
            catch (Exception ex)
            {
                datosForm.Clientes = ServiciosEspecialesService.obtenerComboClientes(int.MinValue);
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarContrato", datosForm);
        }

        [Authorize, HttpGet]
        public ActionResult EditarContrato(string Codigo)
        {
            return View("ActualizarContrato", ServiciosEspecialesService.abrirContratoModel(Codigo));
        }

        [Authorize, HttpPost]
        public ActionResult EditarContrato(string Codigo, ContratosModel model)
        {
            Random rnd = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < model.Contrato.Detalle.Count; i++)
            {
                if (string.IsNullOrEmpty(model.Contrato.Detalle[i].Codigo))
                {
                    model.Contrato.Detalle[i].Id = rnd.Next() + i;
                    model.Contrato.Detalle[i].Codigo = Codigo;
                }
            }
            try
            {
                ServiciosEspecialesService.modificarContrato(model.Contrato);
                return RedirectToAction("Contratos");
            }
            catch (Exception ex)
            {
                model.Clientes = ServiciosEspecialesService.obtenerComboClientes(int.MinValue);
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarContrato", model);
        }

        [Authorize]
        public ActionResult AdicionarContratoDetalleItem()
        {
            return PartialView("DetalleContratoItem", ServiciosEspecialesService.AdicionarContratoDetalleItem());
        }

        [Authorize]
        public ActionResult BajaContrato(string Codigo)
        {
            ViewData["FormatDate"] = ServiciosEspecialesService.formatoFecha();
            return View("BajaContrato", ServiciosEspecialesService.darBajaContratoModel(Codigo, ContratoEstadoEnum.EDITAR));
        }

        [Authorize]
        [HttpPost]
        public ActionResult BajaContrato(string Codigo, ContratosModel model)
        {
            ViewData["FormatDate"] = ServiciosEspecialesService.formatoFecha();
            try
            {
                model.EstadoEdicion = ContratoEstadoEnum.EDITAR;
                if (ServiciosEspecialesService.darBajaContrato(Codigo, model.Contrato.FechaBaja, new Usuario { Codigo = User.Identity.Name }))
                {
                    return RedirectToAction("Contratos");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message + model.Contrato.FechaBaja.ToString());
            }
            return View("BajaContrato", model);
        }


        [Authorize]
        [HttpGet]
        public ActionResult ImprimirContrato(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/ContratoReport.rdlc");
            Contrato contrato = ServiciosEspecialesService.obtenerContrato(Codigo);
            //ReportDataSource reportDataSource = new ReportDataSource("dsCaract", contrato.Caracteristicas);
            //localReport.DataSources.Add(reportDataSource);
            //reportDataSource = new ReportDataSource("dsTramos", ServiciosEspecialesService.obtenerServicioTramos(Codigo));
            //localReport.DataSources.Add(reportDataSource);

            ReportParameter rp = new ReportParameter("Nombre");
            rp.Values.Add(contrato.Codigo);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Descripcion");
            rp.Values.Add(contrato.Descripcion);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Cliente");
            rp.Values.Add(contrato.Cliente.Nombre);
            localReport.SetParameters(rp);

            string sfecinicont = contrato.FechaInicioContrato.ToString("dd-MM-yyyy"); 
            rp = new ReportParameter("Iniciocontrato");
            rp.Values.Add(sfecinicont);
            localReport.SetParameters(rp);

            string sfecfincont = contrato.FechaFinContrato.ToString("dd-MM-yyyy");
            rp = new ReportParameter("Fincontrato");
            rp.Values.Add(sfecfincont);
            localReport.SetParameters(rp);

            rp = new ReportParameter("Estado");
            rp.Values.Add(ContratosModel.Estados(contrato.Estado));
            localReport.SetParameters(rp);

            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }


        // FIN DE CONTRATOS

        [Authorize]
        public ActionResult Convenios()
        {
            return View("Convenios", ServiciosEspecialesService.obtenerListadoConvenios());
        }

        [Authorize]
        public ActionResult CrearConvenio()   //creacion de convenio 2
        {
            return View("ActualizarConvenio", ServiciosEspecialesService.crearNuevoConvenioModel());
        }

        [Authorize, HttpPost]
        public ActionResult CrearConvenio(ConvenioFormModel datosForm)   //formulario para crear convenio3
        {
            //Cargo manualmente el combobox para cuando ocurra un evento alterno 
            //y se deba repintar el form
            datosForm.Clientes = ServiciosEspecialesService.obtenerComboClientes(datosForm.Convenio.Cliente.Codigo);
            //Se asigna al usuario logueado
            datosForm.Convenio.CreadoPor = User.Identity.Name;
            datosForm.EstadoEdicion = "CREAR";
            //Finalmente lo mas importante Guardar
            try
            {
                ServiciosEspecialesService.crearConvenio(datosForm.Convenio);
                return RedirectToAction("Convenios");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarConvenio", datosForm);
        }

        [Authorize]
        public ActionResult EditarConvenio(string Codigo)     //editar convenio  4
        {
            return View("ActualizarConvenio", ServiciosEspecialesService.abrirConvenioModel(Codigo));
        }

        [Authorize, HttpPost]
        public ActionResult EditarConvenio(string Codigo, ConvenioFormModel model)     //editar convenio 5
        {
            model.Clientes = ServiciosEspecialesService.obtenerComboClientes(int.MinValue);
            try
            {
                ServiciosEspecialesService.modificarConvenio(model.Convenio);
                return RedirectToAction("Convenios");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarConvenio", model);
        }

        [Authorize]
        public ActionResult BajaConvenio(string Codigo)
        {
            Convenio model = ServiciosEspecialesService.obtenerConvenio(Codigo);
            model.FechaBaja = DateTime.Now.AddMonths(6).AddHours(1);
            return View("BajaConvenio", model);
        }

        [Authorize, HttpPost]
        public ActionResult BajaConvenio(string Codigo, Convenio model)
        {
            try
            {
                model.Codigo = Codigo;
                model.ModificadoPor = User.Identity.Name;
                if (ServiciosEspecialesService.darBajaConvenio(model))
                {
                    return RedirectToAction("Convenios");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("BajaConvenio", model);
        }

        [Authorize, HttpGet]
        public ActionResult ImprimirConvenio(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/ConvenioReport.rdlc");
            Convenio convenio = ServiciosEspecialesService.obtenerConvenio(Codigo);
            ReportParameter rp = new ReportParameter("Nombre");
            rp.Values.Add(convenio.Codigo);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Descripcion");
            rp.Values.Add(convenio.Descripcion);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Estado");
            rp.Values.Add(ContratosModel.Estados(convenio.Estado));
            localReport.SetParameters(rp);

            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        [Authorize]
        public ActionResult ProyectosEspeciales()
        {
            return View("ProyectosEspeciales", ServiciosEspecialesService.obtenerListadoProyectoEspecial());
        }

        [Authorize]
        public ActionResult CrearProyectoEspecial()
        {
            return View("ActualizarProyectoEspecial", ServiciosEspecialesService.crearNuevoProyectoEspecialModel());
        }

        [Authorize, HttpPost]
        public ActionResult CrearProyectoEspecial(ProyectoEspecialFormModel datosForm)
        {
            datosForm.Cabecera.CreadoPor = User.Identity.Name;
            try
            {
                ServiciosEspecialesService.crearProyectoEspecial(datosForm.Cabecera);
                return RedirectToAction("ProyectosEspeciales");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
                datosForm.EstadoEdicion = "CREAR";
            }
            datosForm = ServiciosEspecialesService.procesarProyectoEspecialModel(datosForm);
            return View("ActualizarProyectoEspecial", datosForm);
        }

        [Authorize]
        public ActionResult EditarProyectoEspecial(string Codigo)
        {
            return View("ActualizarProyectoEspecial", ServiciosEspecialesService.abrirProyectoEspecialModel(Codigo));
        }

        [Authorize, HttpPost]
        public ActionResult EditarProyectoEspecial(string Codigo, ProyectoEspecialFormModel datosForm)
        {
            datosForm.Cabecera.ModificadoPor = User.Identity.Name;
            try
            {
                ServiciosEspecialesService.modificarProyectoEspecial(datosForm.Cabecera);
                return RedirectToAction("ProyectosEspeciales");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
                if (datosForm.Cabecera.Detalle == null)
                {
                    datosForm.Cabecera.Detalle = new List<ProyectoEspecialDetalle>();
                }
                datosForm.Detalle = new List<ProyectoEspecialDetalleFormModel>();
                foreach (var p in datosForm.Cabecera.Detalle)
                {
                    datosForm.Detalle.Add(new ProyectoEspecialDetalleFormModel
                    {
                        Item = p,
                        Servicios = ServiciosEspecialesService.obtenerComboServicios(p.Servicio),
                        Tramos = ServiciosEspecialesService.obtenerComboTramos(p.Tramo)
                    });
                }
                datosForm.Clientes = ServiciosEspecialesService.obtenerComboClientes(datosForm.Cabecera.Cliente.Codigo);
            }
            return View("ActualizarProyectoEspecial", datosForm);
        }

        [Authorize]
        public ActionResult AprobarServicioEspecial()
        {
            int defaultValue = 1;
            return View("AprobarServicioEspecial", ServiciosEspecialesService.aprobarServicioEspecialFormModel(defaultValue));
        }

        [Authorize, HttpPost]
        public ActionResult AprobarServicioEspecial(AprobarServicioEspecialFormModel form)
        {
            if (form.BotonSubmit == form.BotonAprobar)
            {
                ServiciosEspecialesService.aprobarServicioEspecial(form);
            }
            return View("AprobarServicioEspecial", ServiciosEspecialesService.aprobarServicioEspecialFormModel(form.TipoServicio));
        }

        [Authorize]
        [HttpGet]
        public ActionResult ImprimirProyectoEspecial(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/ProyectoEspecialReport.rdlc");
            ProyectoEspecial pryEsp = ServiciosEspecialesService.obtenerProyectoEspecial(Codigo);
            ReportParameter rp = new ReportParameter("Nombre");
            rp.Values.Add(pryEsp.Codigo);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Descripcion");
            rp.Values.Add(pryEsp.Descripcion);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Estado");
            rp.Values.Add(ContratosModel.Estados(pryEsp.Estado));
            localReport.SetParameters(rp);

            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        //AREA DE DETALLES DE SERVICIOS ESPECIALES
        /// <summary>
        /// Agregar un nuevo Item del detalle de Convenio
        /// </summary>
        /// <returns>Contenido Html</returns>
        [Authorize]
        public ActionResult AdicionarConvenioDetalleItem()
        {
            return PartialView("DetalleConvenioItem", ServiciosEspecialesService.AdicionarConvenioDetalleItem());
        }
        [Authorize]
        public ActionResult AdicionarProyectoEspecialDetalleItem()
        {
            return PartialView("DetalleProyectoEspecialItem", ServiciosEspecialesService.AdicionarProyectoEspecialDetalleItem());
        }

        [Authorize]
        public ActionResult BajaProyectoEspecial(string Codigo)
        {
            return View("BajaProyectoEspecial", ServiciosEspecialesService.obtenerProyectoEspecial(Codigo));
        }

        [Authorize]
        [HttpPost]
        public ActionResult BajaProyectoEspecial(string Codigo, ProyectoEspecial model)
        {
            try
            {
                model.Codigo = Codigo;
                model.ModificadoPor = User.Identity.Name;
                if (ServiciosEspecialesService.darBajaProyectoEspecial(model))
                {
                    return RedirectToAction("ProyectosEspeciales");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("BajaProyectoEspecial", model);
        }

        // REPORTE DE SERVICIOS ESPECIALES
        [Authorize]
        public ActionResult ReportesEspeciales()
        {
            ReportesEspecialesModel model = new ReportesEspecialesModel();
            return View(model);
        }

        [Authorize]
        [HttpPost]
        public ActionResult ReportesEspeciales(ReportesEspecialesModel model)
        {
            LocalReport localReport = new LocalReport();
            string prefixNameReport = (model.VerGrafico) ? String.Concat(model.TipoReporte, "_graph") :
                                                            model.TipoReporte.ToString();
            localReport.ReportPath = Server.MapPath("~/Reportes/rptEspeciales" + prefixNameReport + ".rdlc");
            ReportDataSource reportDataSource = new ReportDataSource("DataSet1", ServiciosEspecialesService.ReporteEspecialesDAO.reporteEspeciales(model));
            localReport.DataSources.Add(reportDataSource);
            if (model.VerGrafico)
            {
                reportDataSource = new ReportDataSource("DataSet2", ServiciosEspecialesService.ReporteEspecialesDAO.reporteEspecialGrafico(model));
                localReport.DataSources.Add(reportDataSource);
            }
            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0in</MarginTop>" +
            "  <MarginLeft>0in</MarginLeft>" +
            "  <MarginRight>0in</MarginRight>" +
            "  <MarginBottom>0in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }

        // PROMOCIONES -- VICTOR
        [Authorize]
        public ActionResult Promociones()
        {
            return View("Index", ServiciosEspecialesService.obtenerListadoPromociones());
        }

        public ActionResult CrearPromocion()
        {
            return View("ActualizarPromocion", ServiciosEspecialesService.crearNuevoPromocionModel());
        }

        [Authorize, HttpPost]
        public ActionResult CrearPromocion(PromocionesModel datosForm)
        {
            datosForm.Promocion.UsuarioCreado = User.Identity.Name;
            datosForm.Promocion.UsuarioModificado = User.Identity.Name;
            
            try
            {
                ServiciosEspecialesService.crearPromocion(datosForm.Promocion);
                return RedirectToAction("Promociones");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarPromocion", datosForm);
            //return View("ActualizarPromocion", ServiciosEspecialesService.crearNuevoContratoModel());
        }

        [Authorize, HttpGet]
        public ActionResult EditarPromocion(string Codigo)
        {
            return View("ActualizarPromocion", ServiciosEspecialesService.abrirPromocionModel(Codigo));
        }

        [Authorize, HttpPost]
        public ActionResult EditarPromocion(string Codigo, PromocionesModel model)
        {

            try
            {
                ServiciosEspecialesService.modificarPromocion(model.Promocion);
                return RedirectToAction("Promociones");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("ActualizarPromocion", model);
        }

        [Authorize]
        public ActionResult AdicionarPromocionDetalleItem()
        {
            return PartialView("DetallePromocionItem", ServiciosEspecialesService.AdicionarPromocionDetalleItem());
        }

        [Authorize]
        public ActionResult BajaPromocion(string Codigo)
        {
            return View("BajaPromocion", ServiciosEspecialesService.obtenerPromocion(Codigo));
        }

        [Authorize, HttpPost]
        public ActionResult BajaPromocion(string Codigo, Promocion model)
        {
            try
            {
                model.Codigo = Codigo;
                model.UsuarioModificado = User.Identity.Name;
                if (ServiciosEspecialesService.darBajaPromocion(model))
                {
                    return RedirectToAction("Convenios");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(String.Empty, ex.Message);
            }
            return View("BajaPromocion", model);
        }


        [Authorize, HttpGet]
        public ActionResult ImprimirPromocion(string Codigo)
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Reportes/PromocionReport.rdlc");
            Promocion promocion = ServiciosEspecialesService.obtenerPromocion(Codigo);
            ReportParameter rp = new ReportParameter("Nombre");
            rp.Values.Add(promocion.Codigo);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Descripcion");
            rp.Values.Add(promocion.Descripcion);
            localReport.SetParameters(rp);
            string sfeciniprom = promocion.FechaInicio.ToString("dd-MM-yyyy");
            rp = new ReportParameter("Iniciopromocion");
            rp.Values.Add(sfeciniprom);
            localReport.SetParameters(rp);
            string sfecfinprom = promocion.FechaFin.ToString("dd-MM-yyyy");
            rp = new ReportParameter("Finpromocion");
            rp.Values.Add(sfecfinprom);
            localReport.SetParameters(rp);
            rp = new ReportParameter("Estado");
            rp.Values.Add(ContratosModel.Estados(promocion.Estado));
            localReport.SetParameters(rp);

            localReport.Refresh();
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            string deviceInfo =
            "<DeviceInfo>" +
            "  <OutputFormat>PDF</OutputFormat>" +
            "  <PageWidth>8.5in</PageWidth>" +
            "  <PageHeight>11in</PageHeight>" +
            "  <MarginTop>0.5in</MarginTop>" +
            "  <MarginLeft>1in</MarginLeft>" +
            "  <MarginRight>1in</MarginRight>" +
            "  <MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";
            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);
            return File(renderedBytes, mimeType);
        }


        // FIN DE PROMOCIONES // VICTOR
        [Authorize, HttpGet]
        public JsonResult RecargarComboServicioTramos(string CodServ)
        {
            return Json(ServiciosEspecialesService.obtenerListaServicioTramos(CodServ),JsonRequestBehavior.AllowGet);
        }

    }
}
